﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;


template<class ...Args>
void func(Args&&... args) { //万能引用

	cout << sizeof...(args) << endl;
}
int main() {
	double x = 2.2;
	func();
	func(1);
	func(1, "hello");
	func(1.2, "world", x);
	 
	//区分：
	//函数模板：一个模板可以实例化出多个函数
	//          这些函数的参数的类型不同，但个数相同
	// 
	//可变参数模板：一个模板可以根据实参的参数个数实例化出不同的函数模板
	//              这些模板可以有多个不同的参数：template<class T1,class T2 ...>
	//                                                //即T1与T2可能相同也可能不同
	//              然后这些函数模板会根据实参的参数类型实例化出对应的函数
	
	//编译阶段，本质这⾥会结合引⽤折叠规则实例化出以下四个函数
	void func();
	void func(int&& arg1);
	void func(int&& arg1, string && arg2);
	void func(double&& arg1, string && arg2, double& arg3);


	return 0;
}
